home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / RESHANDL.D < prev    next >
Encoding:
Modula Definition  |  1990-05-27  |  5.4 KB  |  123 lines

  1. DEFINITION MODULE ResHandler;
  2.  
  3. (*------------------------------------------------------------------------------
  4.  * Version 1.3
  5.  *------------------------------------------------------------------------------
  6.  * Written 1989, 1990 by Michael Seyfried
  7.  * Copyright 1989, 1990 by Michael Seyfried, Thomas Tempelmann
  8.  *------------------------------------------------------------------------------
  9.  *                            Modulbeschreibung
  10.  *
  11.  * Bei der Verwaltung von Systemressourcen (z.B: Speicher, Fenster, Daten
  12.  * etc.) in Anwenderprozessen sollte man bei Beendigung dafür sorgen, daß
  13.  * diese wieder freigegeben werden. Insbesondere sollten auch bei Abbruch
  14.  * des Programms die geöffneten Ressourcen korrekt geschlossen werden.
  15.  *
  16.  * Mit Hilfe dieses Moduls kann dies automatisch durchgeführt werden. Dazu
  17.  * werden alle geöffneten Ressourcen in Listen verwaltet. Eine Ressource-Liste
  18.  * kann mit 'CreateResource' angelegt werden. Nach dem Öffnen einer Ressource
  19.  * sollte man diese mit 'InsertHandle' in die richtige Liste eintragen und nur
  20.  * mit 'RemoveHandle' wieder löschen. Mit 'HandleInList' kann man erfragen,
  21.  * ob eine Ressource noch in einer Liste enthalten, d.h. geöffnet ist.
  22.  * Endet ein Prozeß, dann werden alle so verketteten Ressourcen, die von
  23.  * ihm mit 'InsertHandle' eingetragen wurden, automatisch gelöscht.
  24.  *
  25.  * Ein Modul, das diese Funktionen benutzt, sollte in der Regel als System-
  26.  * Modul mit der Option $Y+ (s. Handbuch) übersetzt werden.
  27.  *
  28.  * Eine Demo-Anwendung hierzu findet sich im Modul "SysLibDemo" (s. DEMO-
  29.  * Ordner).
  30.  *------------------------------------------------------------------------------
  31.  *)
  32.  
  33. FROM SYSTEM IMPORT ADDRESS;
  34.  
  35.  
  36. TYPE Resource;                                      (* Ressourceliste *)
  37.  
  38.      CloseProc = PROCEDURE ((* handle *) ADDRESS,
  39.                             (* user   *) BOOLEAN);  (* Freigabe-Prozedur *)
  40.  
  41.  
  42. PROCEDURE CreateResource (VAR rsc: Resource; VAR error: BOOLEAN);
  43.   (*
  44.    * Effekt:  Es wird eine Liste angelegt, in der geöffnete Ressourcen
  45.    *          verkettet werden können.
  46.    * Ausgabe: 'error' ist genau dann TRUE, wenn der Speicher nicht reicht.
  47.    *          Es werden nur wenige Bytes dafür benötigt (ca. 10-50)
  48.    *)
  49.  
  50. PROCEDURE InsertHandle (    rsc: Resource;
  51.                             handle: ADDRESS;
  52.                             close: CloseProc;
  53.                         VAR error: BOOLEAN);
  54.   (*
  55.    * Eingabe: Ressource-Liste, Ressourcekennung und Freigabe-Prozedur
  56.    * Effekt:  Die Resorcekennung wird in der angegebenen Ressource-Liste
  57.    *          eingetragen. Wird nun der Prozeß, von dem aus 'InsertHandle'
  58.    *          aufgerufen wurde, beendet, so wird für jede Ressource die
  59.    *          zuständige Freigabe-Prozedur aufgerufen, und zwar in der
  60.    *          umgekehrten Reihenfolge, in der sie hier angemeldet wurde.
  61.    *          Der Parameter 'user' ist in diesem Fall 'FALSE', da die Freigabe-
  62.    *          prozedur vom System automatisch aufgerufen wurde.
  63.    * Beachte: Eine mit 'InsertHandle' eingetragene Ressource sollte nur mit
  64.    *          'RemoveHandle' freigegeben werden, weil sonst die Freigabe -
  65.    *          Prozedur mit einer ungültigen Kennung aufgerufen wird.
  66.    *          Die Kennungen müssen paarweise verschieden sein (z.B: Adressen)!!
  67.    * Ausgabe: error ist genau dann TRUE, wenn der Speicher nicht reicht.
  68.    *          Es werden nur wenige Bytes dafür benötigt (ca. 10-50)
  69.    *)
  70.  
  71. PROCEDURE InsertSysHandle (    rsc: Resource;
  72.                                handle: ADDRESS;
  73.                                close: CloseProc;
  74.                            VAR error: BOOLEAN);
  75.   (*
  76.    * Wie 'InsertHandle', nur wird die Freigabe-Prozedur nicht automatisch
  77.    * aufgerufen. Dies muß explizit mit 'RemoveHandle' erledigt werden.
  78.    * Zweck dieser Prozedur ist eine einheitliche Verwaltung von Ressourcen
  79.    * und System-Ressourcen während der Laufzeit. So kann z.B. einheitlich
  80.    * mit 'HandleInList' festgestellt werden, ob eine Ressource noch in der
  81.    * zugehörigen Liste, d.h., noch geöffnet ist.
  82.    *)
  83.  
  84. PROCEDURE RemoveHandle (rsc: Resource; handle: ADDRESS);
  85.   (*
  86.    * Eingabe: Ressource-Liste, Kennung einer Ressource
  87.    * Effekt:  Falls die Ressource mit 'InsertHandle' eingetragen wurde, wird
  88.    *          die zugehörige Freigabe-Prozedur (mit 'user = TRUE') aufgerufen
  89.    *          und die Kennung aus der Liste 'rsc' gestrichen.
  90.    *)
  91.  
  92. PROCEDURE HandleInList (rsc: Resource; handle: ADDRESS): BOOLEAN;
  93.   (*
  94.    * Eingabe: Ressource-Liste, Kennung einer Ressource
  95.    * Wert:    genau dann TRUE, wenn die Ressource in 'rsc' eingetragen und
  96.    *          noch nicht wieder mit 'RemoveHandle' gelöscht wurde.
  97.    *)
  98.  
  99.  
  100. (*
  101.  * Mit den folgenden beiden Prozeduren können alle eingetragenen Kennungen in
  102.  * einer Ressource-Liste erfragt werden. Dazu wird erst 'FirstHandle' und dann
  103.  * immerwieder 'NextHandle' aufgerufen, bis NIL zurückgegeben wird.
  104.  * Es ist erlaubt, zwischen 'FirstHandle' und 'NextHandle', andere
  105.  * Prozeduren aus diesem Modul aufzurufen (z.B: 'RemoveHandle').
  106.  *)
  107.  
  108. PROCEDURE FirstHandle (rsc: Resource): ADDRESS;
  109.   (*
  110.    * Eingabe: Ressource-Liste
  111.    * Wert:    Kennung der ersten verketteten Ressource oder NIL, falls die
  112.    *          Liste leer ist.
  113.    *)
  114.  
  115. PROCEDURE NextHandle (rsc: Resource): ADDRESS;
  116.   (*
  117.    * Eingabe: Ressource-Liste
  118.    * Wert:    Kennung der nächsten verketteten Ressource oder NIL, falls dies
  119.    *          nicht existiert.
  120.    *)
  121.  
  122. END ResHandler.
  123.